<?php
class GoodsPriceModel extends Model {
		/* 对应的数据表（不包含表明前缀） */
		protected	$tableName	=	'goods_price';
		
		/**
		*	通过商品id数组查询多个商品的价格
		**/
		public function selectPrices($where,$limited=20){
				if(is_string($where)){
						if(empty($where))$where = " is_delete='N' ";
						else $where = $where." and is_delete='N' ";
				}else{
						$where['is_delete']	=	'N';
				}
				return $this->baseSelectPrice($where,'yes',$limited);
		}
		
		public function baseSelectPrice($where,$return_page='yes',$limited=20,$order=' start_time desc , goods_id desc '){
				if($return_page=='yes'){
					//$pagePrice = $this->where($where)->order($order)->findPage($limited);
					$pagePrice = $this->kPageQuery($where, $order ,$limited);
					return $pagePrice;
				}else{
					$listPrice = $this->where($where)->order($order)->findAll();
					return $listPrice;
				}
		}
		
		/**
		*	通过商户id查询多个商品的价格
		*	未实现
		public function selectByParnterId($partnerId,$limited=20){
				$map['goods_id']	= array('in', $ary_goodsIds);
				$map['is_delete']	=	'N';
				$pagePrice = $this->baseSelectPrice($map,'yes',$limited);
				return $pagePrice;
		}
		**/
		
		/**
		*	通过商户id查询当前时间的价格
		**/
		public function selectCurrentPriceByGoodsId($goodsId){
				$nowtime = time();
				$where = " goods_id=".$goodsId." and expire_time<=".$nowtime
								." and start_time>=".$nowtime." and is_delete='N' and enable=	'Y' ";
				//这边查询出来的应该最多一条数据
				$listPrice = $this->baseSelectPrice($where,'no');
				return $listPrice[0];
		}
		
		
		/**
		*	通过商户id查询最新的价格
		**/
		public function selectRecentPriceByGoodsId($goodsId){
				$nowtime = time();
				$where = " goods_id=".$goodsId." and is_delete='N' and enable=	'Y' ";
				//这边查询出来的应该最多一条数据
				$listPrice = $this->baseSelectPrice($where,'no');
				return $listPrice[0];
		}
		
		
		/**
		*	通过商户id查询多个可用的价格。
		*	价格开始时间大于当前时间的价格。(修改成返回所有有效的价格)
		**/
		public function selectAvailabePriceByGoodsId($goodsId){
				//$nowtime = time();
				$where = " goods_id=".$goodsId." and is_delete='N' and enable=	'Y' ";
								//." and start_time>=".$nowtime." and is_delete='N' and enable=	'Y' ";
				
				$listPrice = $this->baseSelectPrice($where,'no');
				return $listPrice;
		}
		
		
		/**
		*	通过ID查询价格
		**/
		public function selectById($priceId){
				$ary['id']		=	$priceId;
				$ary['is_delete']	=	'N';
				$price = $this->where($ary)->find();
				return $price;
		}
		
		
		/**
		*	录入、更新是检查价格
		*	@param	$price 需要修改、新增的价格数据数组
		*	@return	返回检查结果。true成功，false失败。
		**/
		public function checkPrice($price){
				if(empty($price))return false;
				if(empty($price['goods_id']))return false;
				$result = $this->getNearByPrices($price['goods_id'],$price['id']);
				$status = $result['status'];
				$nearbyPrices = $result['prices'];
				$checkresult = false;
				if($status=='insert'){
						if(empty($nearbyPrices)){
								$checkresult = true;
						}else{
								//判断时间区间
								if(empty($nearbyPrices['next'])){
										$checkresult = false;
								}else{
										$next_price = $nearbyPrices['next'];
										if($next_price['expire_time'] <= $price['start_time']){
												$checkresult = true;
										}else{
												$checkresult = false;
										}
								}
						}
				}
				if($status=='update'){
						if(empty($nearbyPrices)){
								$checkresult = true;
						}else{
								$preview_check 	= false;//对于前一个价格时间的比较结果
								$next_check 		= false;//对于后一个价格时间的比较结果
								
								//比较前一个价格时间
								if(empty($nearbyPrices['preview'])){
										//不存在前一个价格时，无须比较
										$preview_check = true;
								}else{
										//存在前一个价格时，比较开始日期与修改的价格的截止日期。
										$preview_price = $nearbyPrices['preview'];
										if($preview_price['start_time'] >= $price['expire_time']){
												$preview_check = true;
										}else{
												$preview_check = false;
										}
								}
								
								//比较后一个价格时间
								if(empty($nearbyPrices['next'])){
										//不存在后一个价格时，无须比较
										$next_check = true;
								}else{
										//存在后一个价格时，比较截止日期于修改的价格的开始日期。
										$next_price = $nearbyPrices['next'];
										if($next_price['expire_time'] <= $price['start_time']){
												$next_check = true;
										}else{
												$next_check = false;
										}
								}
								
								//均为true，则说明修改的价格时间合理
								if($preview_check&&$next_check){
										$checkresult = true;
								}else{
										$checkresult = false;
								}
						}
				}
				
				return $checkresult;
				
		}
		
		/**
		*	获得邻近的两个价格，即当前价格时间上下的两个价格。
		*	说明：当参数$priceId为null，说明查询商品价格start_time最靠前的价格。
		*				当参数$priceId不为null，说明查询商品指定价格时间（start_time）与$priceId对应的价格开始时间，最近接的上下两个价格。
		*	@param		$goodsId			商品ID
		*	@param		$priceId			价格ID，
		*	@return 	$nearbyPrices 返回数组长度最大二。$nearbyPrices['preview'] - 表示上一个时间。$nearbyPrices['next'] - 表示下一个时间。
		**/
		private function getNearByPrices($goodsId,$priceId=null){
				//按时间降序排列
				$allPrice = $this->baseSelectPrice(' goods_id='.$goodsId." and is_delete='N' ",'no',null,' start_time desc ');
				$status = 'null';
				if(count($allPrice)>0){
						//如果对应id为空则为新增
						if(empty($priceId)){
								//直接返回第一个数组
								$nearbyPrices['next'] = $allPrice[0];
								$status = 'insert';
						}else{
								$status = 'update';
								$len = count($allPrice);
								$index = 0;
								foreach($allPrice as $val){
										if($val['id']==$priceId){
												if($index > 0)$nearbyPrices['preview']=$allPrice[$index-1];
												if($index < ($len-1))$nearbyPrices['next']=$allPrice[$index+1];
												break;
										}
										$index=$index+1;
								}
						}
				}else{
						if(empty($priceId)){
								$status = 'insert';
						}else{
								//说明需要更新的数据不存在
								$status = 'null';
						}
				}
				$result['status'] =  $status;
				$result['prices'] =  $nearbyPrices;
				return $result;
		}
		
		/**
		*	删除价格
		**/
		public function deleteByIds($ids){
				$map['id']	= array('in', $ids);
				$ary['is_delete']	=	'Y';
				$no = $this->where($map)->save($ary);
				return $no;
		}
}
?>